package com.vogue.supplymall.account.config;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.Cookie;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

import com.vogue.configs.startup.SpringContext;
import com.vogue.gear.memory.provider.IMemProvider;
import com.vogue.gear.memory.provider.impl.hash.HazelHashProvider;
import com.vogue.supplymall.account.shiro.filter.LoginAuthenticationFilter;
import com.vogue.supplymall.account.shiro.filter.MallAuthenticationFilter;
import com.vogue.supplymall.account.shiro.listener.MallSessionListener;
import com.vogue.supplymall.account.shiro.realm.AuthRealm;
import com.vogue.supplymall.account.shiro.session.MallSessionDao;

import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.session.SessionListener;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.session.mgt.eis.SessionIdGenerator;
import org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * shiro的配置类<br>
 * 
 * @author 崔岳
 *
 */
@Configuration
@Import(SpringContext.class)
@Component("shiroconfig")
public class ShiroConfiguration{// extends WebMvcConfigurerAdapter {

	public static final Logger LOGGER_SHIROCONFIGURATION = LoggerFactory.getLogger(ShiroConfiguration.class);

//    /**
//	 * 登录过滤器
//	 * @return
//	 */
//	@Bean(name = "loginfilter")
//	public LoginAuthenticationFilter loginfilter() {
//		LoginAuthenticationFilter filter = new LoginAuthenticationFilter();
//		filter.setUsernameParam("username");
//		filter.setPasswordParam("password");
//		filter.setRememberMeParam("rememberMeNo");// 如果要启用cookie去掉No即可
//		filter.setFailureKeyAttribute("shiroLoginFailure");
//		return filter;
//	}
//	
//	/**
//	 * 有效session拦截过滤器
//	 * @return
//	 */
//	@Bean(name = "authcFilter")
//	public MallAuthenticationFilter authcFilter() {
//		MallAuthenticationFilter filter = new MallAuthenticationFilter();		
//		return filter;
//	}
//	
//	/**
//	 * 缓存管理
//	 * 
//	 * @return
//	 */
//	@Bean(name = "shiroCacheManager")
//	public EhCacheManager getEhCacheManager() {
//		EhCacheManager em = new EhCacheManager();
//		em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
//		return em;
//	}
//
//	/**
//	 * 全局过滤器
//	 * 
//	 * @param manager
//	 * @return
//	 */
//	@Bean(name = "shiroFilter")
//	public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") DefaultWebSecurityManager manager
//			,@Qualifier("authcFilter") MallAuthenticationFilter authcFilter
//			,@Qualifier("loginfilter") LoginAuthenticationFilter loginfilter
//			) {
//		logger.debug("-------shiroFilter------");
//		ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//		bean.setSecurityManager(manager);
//		// 配置登录的url和登录成功的url
//		bean.setLoginUrl("/suppliermall/login");
//		bean.setSuccessUrl("/suppliermall/home");
//		bean.setUnauthorizedUrl("/suppliermall/login");	
//		
//		Map<String, javax.servlet.Filter> filterMap = new HashMap<>();
//		filterMap.put("loginfilter", loginfilter);
//		filterMap.put("authc", authcFilter);
//
//		bean.setFilters(filterMap);
//		// 配置访问权限
//		LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
//		// filterChainDefinitionMap.put("/jsp/login.jsp*", "anon"); //表示可以匿名访问
//		filterChainDefinitionMap.put("/suppliermall/is/**", "authc");
//		filterChainDefinitionMap.put("/**/login", "loginfilter");
//		bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
//		SecurityUtils.setSecurityManager(manager); 
//		return bean;
//	}
//
//	/**
//	 * 配置核心安全事务管理器
//	 * 
//	 * @param authRealm
//	 * @return
//	 */
//	@Bean(name = "securityManager")
//	public DefaultWebSecurityManager securityManager(@Qualifier("authRealm") AuthRealm authRealm,
//			@Qualifier("rememberMeManager") CookieRememberMeManager rememberMeManager,
//			@Qualifier("shiroCacheManager") CacheManager ehCacheManager,
//			@Qualifier("sessionManager") SessionManager sessionManager) {
//		DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
//		manager.setRealm(authRealm);
//		manager.setRememberMeManager(rememberMeManager);
//		manager.setCacheManager(ehCacheManager);
//		manager.setSessionManager(sessionManager);
//		return manager;
//	}
//
//	/**
//	 * 会话验证调度器
//	 * 
//	 * @param sessionManager
//	 * @return
//	 */
//	@Bean(name = "sessionValidationScheduler")
//	public QuartzSessionValidationScheduler sessionValidationScheduler() {
//		QuartzSessionValidationScheduler sessionValidationScheduler = new QuartzSessionValidationScheduler();
//		return sessionValidationScheduler;
//	}
//
//	@SuppressWarnings("rawtypes")
//	@Bean(name = "memProviderAdapter")
//	public IMemProvider memProviderAdapter() {
//		HazelHashProvider handle=new HazelHashProvider("sessionKey");
//		handle.setBackupCount(2);
//		return handle;
//	}
//	
//	/**
//	 * session回话Dao
//	 * 
//	 * @return
//	 */
//	@SuppressWarnings({ "rawtypes", "unchecked" })
//	@Bean(name = "sessionDAO")
//	public MallSessionDao sessionDAO(
//			@Qualifier("sessionIdGenerator") SessionIdGenerator sessionIdGenerator
//			,@Qualifier("memProviderAdapter") IMemProvider memProviderAdapter) {
//		MallSessionDao sessionDAO = new MallSessionDao(memProviderAdapter);
//		sessionDAO.setActiveSessionsCacheName("shiro-activeSessionCache");
//		sessionDAO.setSessionIdGenerator(sessionIdGenerator);
//		return sessionDAO;
//	}
//
//	/**
//	 * 会话ID生成器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionIdGenerator")
//	public JavaUuidSessionIdGenerator sessionIdGenerator() {
//		return new JavaUuidSessionIdGenerator();
//	}
//
//	/**
//	 * 会话监听器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionListener")
//	public SessionListener sessionListener() {
//		return new MallSessionListener();
//	}
//
//	/**
//	 * session 管理器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionManager")
//	public DefaultWebSessionManager sessionManager(
//			@Qualifier("sessionValidationScheduler") QuartzSessionValidationScheduler sessionValidationScheduler,
//			@Qualifier("sessionDAO") SessionDAO sessionDAO, 
//			@Qualifier("sessionIdCookie") Cookie sessionIdCookie,
//			@Qualifier("sessionListener") SessionListener sessionListener) {
//		DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//		sessionManager.setGlobalSessionTimeout(14400000);// 4小时session过期时间
//		sessionManager.setDeleteInvalidSessions(true);
//		sessionManager.setSessionValidationSchedulerEnabled(true);
//		sessionValidationScheduler.setSessionValidationInterval(1800000);// 30分钟间隔检查
//		sessionValidationScheduler.setSessionManager(sessionManager);
//		sessionManager.setSessionValidationScheduler(sessionValidationScheduler);
//		sessionManager.setSessionDAO(sessionDAO);
//		sessionManager.setSessionIdCookieEnabled(true);
//		sessionManager.setSessionIdCookie(sessionIdCookie);
//		List<SessionListener> list = new ArrayList<>();
//		list.add(sessionListener);
//		sessionManager.setSessionListeners(list);
//		return sessionManager;
//	}
//
//	/**
//	 * 配置自定义的权限登录器
//	 * 
//	 * @param matcher
//	 * @return
//	 */
//	@Bean(name = "authRealm")
//	public AuthRealm authRealm(@Qualifier("credentialsMatcher") CredentialsMatcher matcher) {
//		AuthRealm authRealm = new com.vogue.supplymall.account.shiro.realm.AuthRealm();
//		authRealm.setCredentialsMatcher(matcher);
//		authRealm.setCachingEnabled(false);
//		authRealm.setAuthenticationCachingEnabled(false);
//		authRealm.setAuthenticationCacheName("authenticationCache");
//		authRealm.setAuthorizationCachingEnabled(false);
//		authRealm.setAuthorizationCacheName("authorizationCache");
//		return authRealm;
//	}
//
//	/**
//	 * 配置自定义的密码比较器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "credentialsMatcher")
//	public CredentialsMatcher credentialsMatcher() {
//		com.vogue.supplymall.account.shiro.credentials.CredentialsMatcher match = new com.vogue.supplymall.account.shiro.credentials.CredentialsMatcher(
//				getEhCacheManager());
//		match.setHashAlgorithmName("md5");
//		match.setHashIterations(1);
//		match.setStoredCredentialsHexEncoded(true);
//		return match;
//	}
//
//	/**
//	 * Shiro sessionManager 配置的cookie管理模板
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionIdCookie")
//	public SimpleCookie sessionIdCookie() {
//		SimpleCookie cookie = new SimpleCookie("sid");
//		cookie.setHttpOnly(true);
//		cookie.setMaxAge(-1);
//		return cookie;
//	}
//
//	/**
//	 * rememberMe管理器 配置的cookie管理模板
//	 * 
//	 * @return
//	 */
//	@Bean(name = "rememberMeCookie")
//	public SimpleCookie rememberMeCookie() {
//		SimpleCookie cookie = new SimpleCookie("rememberMe");
//		cookie.setHttpOnly(true);
//		cookie.setMaxAge(2592000);// 30天
//		return cookie;
//	}
//
//	@SuppressWarnings("static-access")
//	@Bean(name = "rememberMeManager")
//	public CookieRememberMeManager rememberMeManager(@Qualifier("rememberMeCookie") SimpleCookie cookie) {
//		CookieRememberMeManager manager = new CookieRememberMeManager();
//		org.apache.shiro.codec.Base64 code = new org.apache.shiro.codec.Base64();
//		manager.setCipherKey(code.decode("4AvVhmFLUs0KTA3Kprsdag=="));
//		manager.setCookie(cookie);
//		return manager;
//	}
//
//	/**
//	 * Shiro生命周期处理器
//	 * 
//	 * @return
//	 */
//	@Bean
//	public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
//		return new LifecycleBeanPostProcessor();
//	}
//
//	@Bean
//	public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
//		DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
//		creator.setProxyTargetClass(true);
//		return creator;
//	}
//
//	@Bean
//	public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
//			@Qualifier("securityManager") DefaultWebSecurityManager manager) {
//		AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
//		advisor.setSecurityManager(manager);
//		return advisor;
//	}
	
	
//	/**
//	 * 登录过滤器
//	 * @return
//	 */
//	@Bean(name = "loginfilter")
//	public AccessControlFilter loginfilter() {
//		LoginAuthenticationFilter filter = new LoginAuthenticationFilter();
//		filter.setUsernameParam("username");
//		filter.setPasswordParam("password");
//		filter.setRememberMeParam("rememberMe");// 如果要启用cookie去掉No即可
//		filter.setFailureKeyAttribute("shiroLoginFailure");
//		return filter;
//	}
//	
//	/**
//	 * 有效session拦截过滤器
//	 * @return
//	 */
//	@Bean(name = "authcFilter")
//	public AccessControlFilter authcFilter() {
//		MallAuthenticationFilter filter = new MallAuthenticationFilter();		
//		return filter;
//	}
//	
//	/**
//	 * 缓存管理
//	 * 
//	 * @return
//	 */
//	@Bean(name = "shiroCacheManager")
//	public EhCacheManager getEhCacheManager() {
//		EhCacheManager em = new EhCacheManager();
//		em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
//		return em;
//	}
//
//	/**
//	 * 全局过滤器
//	 * 
//	 * @param manager
//	 * @return
//	 */
//	@Bean(name = "shiroFilter")
//	public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager manager,
//			@Qualifier("loginfilter")AccessControlFilter loginfilter,
//			@Qualifier("authcFilter")AccessControlFilter authcFilter) {
//		logger.debug("-------shiroFilter------");
//		ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//		bean.setSecurityManager(manager);
//		// 配置登录的url和登录成功的url
//		bean.setLoginUrl("/suppliermall/login");
//		bean.setSuccessUrl("/suppliermall/home");
//		bean.setUnauthorizedUrl("/suppliermall/login");
//
//		Map<String, javax.servlet.Filter> filterMap = new HashMap<>();
//		filterMap.put("loginfilter", loginfilter);
//		filterMap.put("authc", authcFilter);
//		
//		bean.setFilters(filterMap);
//		// 配置访问权限
//		LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
//		// filterChainDefinitionMap.put("/jsp/login.jsp*", "anon"); //表示可以匿名访问
//		filterChainDefinitionMap.put("/suppliermall/is/**", "authc");
//		filterChainDefinitionMap.put("/**/login", "loginfilter");
//		bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
//		SecurityUtils.setSecurityManager(manager); 
//		return bean;
//	}
//
//	/**
//	 * 配置核心安全事务管理器
//	 * 
//	 * @param authRealm
//	 * @return
//	 */
//	@Bean(name = "securityManager")
//	public SecurityManager securityManager(@Qualifier("authRealm") AuthRealm authRealm,
//			@Qualifier("rememberMeManager") CookieRememberMeManager rememberMeManager,
//			@Qualifier("shiroCacheManager") CacheManager ehCacheManager,
//			@Qualifier("sessionManager") SessionManager sessionManager) {
//		DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
//		manager.setRealm(authRealm);
//		manager.setRememberMeManager(rememberMeManager);
//		manager.setCacheManager(ehCacheManager);
//		manager.setSessionManager(sessionManager);
//		return manager;
//	}
//
//	/**
//	 * 会话验证调度器
//	 * 
//	 * @param sessionManager
//	 * @return
//	 */
//	@Bean(name = "sessionValidationScheduler")
//	public QuartzSessionValidationScheduler sessionValidationScheduler() {
//		QuartzSessionValidationScheduler sessionValidationScheduler = new QuartzSessionValidationScheduler();
//		return sessionValidationScheduler;
//	}
//
//	/**
//	 * session回话Dao
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionDAO")
//	public EnterpriseCacheSessionDAO sessionDAO(
//			@Qualifier("sessionIdGenerator") SessionIdGenerator sessionIdGenerator) {
//		EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO();
//		sessionDAO.setActiveSessionsCacheName("shiro-activeSessionCache");
//		sessionDAO.setSessionIdGenerator(sessionIdGenerator);
//		return sessionDAO;
//	}
//
//	/**
//	 * 会话ID生成器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionIdGenerator")
//	public JavaUuidSessionIdGenerator sessionIdGenerator() {
//		return new JavaUuidSessionIdGenerator();
//	}
//
//	/**
//	 * 会话监听器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionListener")
//	public SessionListener sessionListener() {
//		return new MallSessionListener();
//	}
//
//	/**
//	 * session 管理器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionManager")
//	public DefaultWebSessionManager sessionManager(
//			@Qualifier("sessionValidationScheduler") QuartzSessionValidationScheduler sessionValidationScheduler,
//			@Qualifier("sessionDAO") SessionDAO sessionDAO, 
//			@Qualifier("sessionIdCookie") Cookie sessionIdCookie,
//			@Qualifier("sessionListener") SessionListener sessionListener) {
//		DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//		sessionManager.setGlobalSessionTimeout(14400000);// 4小时session过期时间
//		sessionManager.setDeleteInvalidSessions(true);
//		sessionManager.setSessionValidationSchedulerEnabled(true);
//		sessionValidationScheduler.setSessionValidationInterval(1800000);// 30分钟间隔检查
//		sessionValidationScheduler.setSessionManager(sessionManager);
//		sessionManager.setSessionValidationScheduler(sessionValidationScheduler);
//		sessionManager.setSessionDAO(sessionDAO);
//		sessionManager.setSessionIdCookieEnabled(true);
//		sessionManager.setSessionIdCookie(sessionIdCookie);
//		List<SessionListener> list = new ArrayList<>();
//		list.add(sessionListener);
//		sessionManager.setSessionListeners(list);
//		return sessionManager;
//	}
//
//	/**
//	 * 配置自定义的权限登录器
//	 * 
//	 * @param matcher
//	 * @return
//	 */
//	@Bean(name = "authRealm")
//	public AuthRealm authRealm(@Qualifier("credentialsMatcher") CredentialsMatcher matcher) {
//		AuthRealm authRealm = new com.vogue.supplymall.account.shiro.realm.AuthRealm();
//		authRealm.setCredentialsMatcher(matcher);
//		authRealm.setCachingEnabled(true);
//		authRealm.setAuthenticationCachingEnabled(true);
//		authRealm.setAuthenticationCacheName("authenticationCache");
//		authRealm.setAuthorizationCachingEnabled(true);
//		authRealm.setAuthorizationCacheName("authorizationCache");
//		return authRealm;
//	}
//
//	/**
//	 * 配置自定义的密码比较器
//	 * 
//	 * @return
//	 */
//	@Bean(name = "credentialsMatcher")
//	public CredentialsMatcher credentialsMatcher() {
//		com.vogue.supplymall.account.shiro.credentials.CredentialsMatcher match = new com.vogue.supplymall.account.shiro.credentials.CredentialsMatcher(
//				getEhCacheManager());
//		match.setHashAlgorithmName("md5");
//		match.setHashIterations(1);
//		match.setStoredCredentialsHexEncoded(true);
//		return match;
//	}
//
//	/**
//	 * Shiro sessionManager 配置的cookie管理模板
//	 * 
//	 * @return
//	 */
//	@Bean(name = "sessionIdCookie")
//	public SimpleCookie sessionIdCookie() {
//		SimpleCookie cookie = new SimpleCookie("sid");
//		cookie.setHttpOnly(true);
//		cookie.setMaxAge(-1);
//		return cookie;
//	}
//
//	/**
//	 * rememberMe管理器 配置的cookie管理模板
//	 * 
//	 * @return
//	 */
//	@Bean(name = "rememberMeCookie")
//	public SimpleCookie rememberMeCookie() {
//		SimpleCookie cookie = new SimpleCookie("rememberMe");
//		cookie.setHttpOnly(true);
//		cookie.setMaxAge(2592000);// 30天
//		return cookie;
//	}
//
//	@SuppressWarnings("static-access")
//	@Bean(name = "rememberMeManager")
//	public CookieRememberMeManager rememberMeManager(@Qualifier("rememberMeCookie") SimpleCookie cookie) {
//		CookieRememberMeManager manager = new CookieRememberMeManager();
//		org.apache.shiro.codec.Base64 code = new org.apache.shiro.codec.Base64();
//		manager.setCipherKey(code.decode("4AvVhmFLUs0KTA3Kprsdag=="));
//		manager.setCookie(cookie);
//		return manager;
//	}
//
//	/**
//	 * Shiro生命周期处理器
//	 * 
//	 * @return
//	 */
//	@Bean
//	public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
//		return new LifecycleBeanPostProcessor();
//	}
//
//	@Bean
//	public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
//		DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
//		creator.setProxyTargetClass(true);
//		return creator;
//	}
//
//	@Bean
//	public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
//			@Qualifier("securityManager") SecurityManager manager) {
//		AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
//		advisor.setSecurityManager(manager);
//		return advisor;
//	}

}
